package com.sugar.base.core;

import java.io.Serializable;
import java.util.LinkedHashMap;
import java.util.List;

import com.sugar.base.query.PageModel;

/**
 * @标题：数据访问接口
 * @描述：封装持久化操作（增、删、改、查）
 * @编写者：杨浩泉
 * @日期：2011-5-8 <b>下午04:45:17</b>
 */
public interface IHibernateBaseDao<T> {
	
	/***
	 * 持久化作新对象
	 * @param entity 持久化对象（PO）
	 * @throws RuntimeException
	 */
	public void saveEntityBaseDao(T entity) throws RuntimeException ;
	
	/**
	 * 持久化作新对象
	 * @param entity 持久化对象（PO）
	 * @return 返回该记录的唯一编号
	 * @throws RuntimeException
	 */
	public Serializable saveEntityRetBaseDao(T entity) throws RuntimeException ;

	/**
	 * 删除对象
	 * @param entity 需要删除的PO对象
	 * @throws RuntimeException
	 */
	public void deleteEntityBaseDao(T entity) throws RuntimeException ;
	
	/**
	 * 根据唯一编号进行删除
	 * @param entityName PO类的名称
	 * @param delId 唯一编号
	 * @return 返回true / false
	 * @throws RuntimeException
	 */
	public void deleteEntityByIdBaseDao(Class<T> entityName , Serializable delId) throws RuntimeException ;
	
	/**
	 * 根据多个唯一编号进行删除
	 * @param entityName PO类的名称
	 * @param delIds 唯一编号（数组）
	 * @throws RuntimeException
	 */
	public void deleteEntityMoreIdBaseDao(Class<T> entityName , Object[] delIds) throws RuntimeException ;
	
	/**
	 * 根据ID修改PO对象
	 * @param entity PO对象
	 * @return 返回修改的行数
	 * @throws RuntimeException
	 */
	public void updateEntityBaseDao(T entity) throws RuntimeException ;
	
	/**
	 * 根据条件修改或删除数据
	 * @param queryString 修改或者查询的语句
	 * @param field 修改的字段属性
	 * @param whereString 条件语句
	 * @param param 修改的参数
	 * @return 返回修改或删除的个数
	 * @throws RuntimeException
	 */
	public int executeUpdateOrDeleteByField(String queryString,String field,String whereString,Object[] param) throws RuntimeException ;
	
	/**
	 * 根据ID加载数据（不带延迟加载）
	 * @param clazz 对应的PO对象
	 * @param id 唯一编号
	 * @return 返回指定类型
	 * @throws RuntimeException
	 */
	public T getEntityById(Class<T> entityName,Serializable id) throws RuntimeException ;
	
	/**
	 * 根据ID加载数据（带延迟加载）
	 * @param clazz 对应的PO对象
	 * @param id 唯一编号
	 * @return 返回指定类型
	 * @throws RuntimeException
	 */
	public T loadEntityById(Class<T> entityName,Serializable id) throws RuntimeException ;
	
	/**
	 * 根据条件查询返回唯一PO对象
	 * @param queryString 查询语句
	 * @param whereString 查询条件
	 * @param param	查询参数
	 * @return 返回唯一PO对象
	 * @throws RuntimeException
	 */
	public T findEntityByParam(String queryString,String whereString,Object[] param) throws RuntimeException ;
	
	/**
	 * 根据条件查询返回唯一PO对象
	 * @param queryString 查询语句
	 * @param whereString 查询条件
	 * @param param 查询参数
	 * @param orderby 排序
	 * @return 根据条件查询返回唯一PO对象
	 * @throws RuntimeException
	 */
	public List<T> findMoreEntityByParam(String queryString,String whereString,Object[] param,LinkedHashMap<String, String> orderby) throws RuntimeException ;
	public List<T> findMoreEntityByParam(String queryString,String whereString,Object[] param) throws RuntimeException ;
	public List<T> findMoreEntityByParam(String queryString,LinkedHashMap<String, String> orderby) throws RuntimeException ;
	public List<T> findMoreEntityByParam(String queryString) throws RuntimeException ;
	
	/**
	 * 根据条件查询并进行分页
	 * @param queryString 查询语句
	 * @param whereString 查询条件
	 * @param param 查询参数
	 * @param firstPage 起始也
	 * @param pageSize 每页显示多少条记录
	 * @param orderby 排序
	 * @return 返回PageModel对象（封装了查询的数据以及数据的总记录数）
	 * @throws RuntimeException
	 */
	public PageModel<T> getScrollRecord(String queryString,String whereString,Object[] param,int firstPage,int pageSize,LinkedHashMap<String, String> orderby) throws RuntimeException ;
	public PageModel<T> getScrollRecord(String queryString,String whereString,Object[] param,int firstPage,int pageSize) throws RuntimeException ;
	public PageModel<T> getScrollRecord(String queryString,int firstPage,int pageSize,LinkedHashMap<String, String> orderby) throws RuntimeException ;
	public PageModel<T> getScrollRecord(String queryString,int firstPage,int pageSize) throws RuntimeException ;
	
	
}
